package com.rimi.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.rimi.bean.YqzcGoods;
import com.rimi.mapper.GoodsMapper;
import com.rimi.model.dto.*;
import com.rimi.service.GoodsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class GoodsServiceImpl implements GoodsService {

    @Autowired
    private GoodsMapper goodsMapper;

    //初始化页数
    private static final Integer PAGE_NUM = 0;
    //初始化每页显示的商品数量
    private static final Integer PAGE_SIZE = 8;

    /**
     * 通过（产品类型goodsType(必填项)）进行产品列表筛选（后面内容非必填，可以模糊查询）（产品分类classification，品牌brand，价格区间price boGoodsPrice下限  upGoodsPrice上限）
     * @param pageNum 当前页数
     * @param pageSize 每页多少条
     * @param goodsType 商品类型
     * @param goodsClassification 商品分类
     * @param goodsBrand 商品品牌
     * @param boGoodsPrice 最低价格
     * @param upGoodsPrice 最高价格
     * @return 商品列表
     */
    @Override
    public PageInfo searchGoodsList(Integer pageNum,Integer pageSize,String goodsType,String goodsClassification, String goodsBrand, Integer boGoodsPrice, Integer upGoodsPrice) {
        //前端传过来的分页为空就使用默认分页
        innitPage(pageNum, pageSize);
        List<YqzcGoods> yqzcGoods = goodsMapper.searchGoodsList(goodsType,goodsClassification, goodsBrand, boGoodsPrice, upGoodsPrice);
        return getPageInfo(goodsType,yqzcGoods);
    }

    /**
     * 模糊查询 查询所有的商品
     * @return CommonResult
     */
    @Override
    public PageInfo topSearch(String goodsName,Integer pageNum,Integer pageSize ) {
        //前端传过来的分页为空就使用默认分页
        innitPage(pageNum, pageSize);
        //查询数据库
        List<YqzcGoods> yqzcGoods = goodsMapper.findGoodsByName(goodsName);
        return PageInfo.of(yqzcGoods);
    }
    /**
     * 根据sku查询商品
     * @param goodsSku 商品sku
     * @return 商品
     */
    @Override
    public YqzcGoods findGoodsBySku(Integer goodsSku) {
        //数据库查询
        return goodsMapper.findGoodsBySku(goodsSku);
    }

    /**
     * 根据type查询商品
     * @param goodsType 类型
     * @return 分页数据
     */
    @Override
    public PageInfo findAllGoodsByType(String goodsType, Integer pageNum, Integer pageSize) {
        //前端传过来的分页为空就使用默认分页
        innitPage(pageNum, pageSize);
        //查询数据库
        List<YqzcGoods> yqzcGoods = goodsMapper.findAllGoodsByType(goodsType);
        return getPageInfo(goodsType, yqzcGoods);
    }
    /**
     * 根据类型和分类查找商品
     * @param pageNum 页数
     * @param pageSize 每页条数
     * @param goodsType 商品分类
     * @param goodsClassify 商品类型
     * @return 商品列表
     */
    @Override
    public PageInfo findGoodsByTypeAndClassify(Integer pageNum, Integer pageSize, String goodsType, String goodsClassify) {
        //前端传过来的分页为空就使用默认分页
        innitPage(pageNum, pageSize);
        List<YqzcGoods> yqzcGoods = goodsMapper.findGoodsByTypeAndClassify(goodsType,goodsClassify);
        return getPageInfo(goodsType, yqzcGoods);
    }

    /**
     * 获取随机商品
     * @return 单独随机商品
     */
    @Override
    public List<YqzcGoods> findAllGoods() {
        return goodsMapper.findAllGoods();
    }


    /**
     *  根据不同类型返回不同dto
     * @param goodsType 类型
     * @param yqzcGoods 数据库查询返回的集合
     * @return 分页信息
     */
    private PageInfo getPageInfo(String goodsType, List<YqzcGoods> yqzcGoods) {
        switch (goodsType) {
            case "办公租赁":
                List<RentListGoodsDto> rentListGoods = new ArrayList<>();
                for (YqzcGoods allRentGood : yqzcGoods) {
                    RentListGoodsDto rentListGoodsDto = new RentListGoodsDto();
                    BeanUtils.copyProperties(allRentGood, rentListGoodsDto);
                    rentListGoods.add(rentListGoodsDto);
                }
                return PageInfo.of(rentListGoods);
            case "办公采购":
                List<BuyGoodsDto> buyGoodsDtos = new ArrayList<>();
                for (YqzcGoods allRentGood : yqzcGoods) {
                    BuyGoodsDto buyGoodsDto = new BuyGoodsDto();
                    BeanUtils.copyProperties(allRentGood, buyGoodsDto);
                    buyGoodsDtos.add(buyGoodsDto);
                }
                return PageInfo.of(buyGoodsDtos);
            case "企业定制":
                List<MadeGoodsDto> madeGoodsDtos = new ArrayList<>();
                for (YqzcGoods allRentGood : yqzcGoods) {
                    MadeGoodsDto madeGoodsDto = new MadeGoodsDto();
                    BeanUtils.copyProperties(allRentGood, madeGoodsDto);
                    madeGoodsDtos.add(madeGoodsDto);
                }
                return PageInfo.of(madeGoodsDtos);
            default:
                return new PageInfo();
        }
    }
    /**
     * 当前端传过来没有分页的时候 后端使用默认分页
     * @param pageNum 页数
     * @param pageSize 每页个数
     */
    private void innitPage(Integer pageNum, Integer pageSize) {
        if (pageNum == null && pageSize == null) {
            PageHelper.startPage(PAGE_NUM, PAGE_SIZE);
        } else {
            PageHelper.startPage(pageNum, pageSize);
        }
    }


}
